﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CondominioG1.Persistencia.NHibernate;
using CondominioG1.Dominio;
using NHibernate.Criterion;


namespace CondominioG1.Negocio
{
    public class AreaService
    {
        // Dependencias con la capa de persistencia
        public AreaDAO AreaDAO { get; set; }

        // Mapeo de funcionalidades
        public Area RegistrarArea(String Codigo, String Tipo,String Ubicacion,Int32 Capacidad, String Estado)
        {

            // Validación de existencia de una area con el mismo codigo
            if (AreaDAO.Obtener(Codigo) != null)
                throw new Exception("Ya existe un AREA con el CODIGO indicado");

            // Validación de Codigo
            if (null == Codigo || String.Empty.Equals(Codigo))
                throw new Exception("El dato Codigo es obligatorio");
            // Validación de Tipo
            if (null == Tipo || String.Empty.Equals(Tipo))
                throw new Exception("El dato Tipo es obligatorio");
            // Validación de Ubicacion
            if (null == Ubicacion || String.Empty.Equals(Ubicacion))
                throw new Exception("El dato Ubicacion es obligatorio");
            // Validación de Capacidad
            if (null == Capacidad || String.Empty.Equals(Capacidad))
                throw new Exception("El dato Capacidad es obligatorio");
            // Validación de Estado
            if (null == Estado || String.Empty.Equals(Estado))
                throw new Exception("El dato Estado es obligatorio");

            // Generar nueva secuencia para Area
            Area areaACrear = new Area();
            areaACrear.Codigo = Codigo;
            areaACrear.Tipo = Tipo;
            areaACrear.Ubicacion = Ubicacion;
            areaACrear.Capacidad = Capacidad;
            areaACrear.Estado = Estado;

            Area AreaCreada = AreaDAO.Crear(areaACrear);
            return AreaCreada;
        }

        public Area ModificarArea(String Codigo, String Tipo, String Ubicacion, Int32 Capacidad, String Estado)
        {
            // Validacion de existencia de Area
            AreaDAO AreaDAO = new AreaDAO();
            Area AreaExistente = AreaDAO.Obtener(Codigo);
            if (null == AreaExistente)
                throw new Exception("El Area NO EXISTE...");

            // Validación de TIPO
            if (null == Tipo || String.Empty.Equals(Tipo))
                throw new Exception("El dato TIPO es obligatorio");
            // Validación de UBICACION
            if (null == Ubicacion || String.Empty.Equals(Ubicacion))
                throw new Exception("El dato UBICACION es obligatorio");
            // Validación de CAPACIDAD
            if (null == Capacidad || String.Empty.Equals(Capacidad))
                throw new Exception("El dato CAPACIDAD es obligatorio");
            // Validación de ESTADO
            if (null == Estado || String.Empty.Equals(Estado))
                throw new Exception("El dato ESTADO es obligatorio");

            Area areaAModificar = new Area();
            areaAModificar = AreaExistente;
            areaAModificar.Tipo = Tipo;
            areaAModificar.Ubicacion = Ubicacion;
            areaAModificar.Capacidad = Capacidad;
            areaAModificar.Estado = Estado;

            Area AreaModificado = AreaDAO.Modificar(areaAModificar);
            return AreaModificado;

        }

        public Area EliminarArea(String Codigo)
        {
            // Validacion de existencia de Area
            AreaDAO AreaDAO = new AreaDAO();
            Area AreaExistente = AreaDAO.Obtener(Codigo);
            if (null == AreaExistente)
                throw new Exception("El AREA no existe...");

            Area Area = new Area();
            Area = AreaExistente;
            AreaDAO.Eliminar(Area);
            return Area;
        }

        public Area ObtenerArea(String Codigo)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return AreaDAO.Obtener(Codigo);
        }

        public ICollection<Area> ListarReservaAreas(String estado)
        {
            return AreaDAO.ListarReservaAreas(estado);
        }

        public ICollection<Area> ListarTodasAreas()
        {
            return AreaDAO.Listar(DetachedCriteria.For<Area>());
        }

        public void EliminarAreas()
        {
            foreach (Area area in AreaDAO.Listar(DetachedCriteria.For<Area>()))
                AreaDAO.Eliminar(area);
        }


    }
}

